package com.tjy.farmer.util;

import com.tjy.farmer.domain.Location;

import java.util.List;

/**
 * 地理工具类，包含点是否在多边形内的判断算法
 */
public class GeoUtils {

    /**
     * 判断点是否在多边形内（射线法）
     * @param point 要判断的点
     * @param polygon 多边形的顶点列表
     * @return 如果点在多边形内，返回true；否则返回false
     */
    public static boolean isPointInPolygon(Location point, List<Location> polygon) {
        // 多边形顶点数量
        int vertexCount = polygon.size();
        if (vertexCount < 3) {
            // 多边形至少需要3个顶点
            return false;
        }
        
        boolean inside = false;
        double x = point.getLongitude();
        double y = point.getLatitude();
        
        // 遍历多边形的每条边
        for (int i = 0, j = vertexCount - 1; i < vertexCount; j = i++) {
            Location pi = polygon.get(i);
            Location pj = polygon.get(j);
            
            double xi = pi.getLongitude(), yi = pi.getLatitude();
            double xj = pj.getLongitude(), yj = pj.getLatitude();
            
            // 检查点是否在边的端点上
            if ((xi == x && yi == y) || (xj == x && yj == y)) {
                return true;
            }
            
            // 检查射线是否与边相交
            if (((yi > y) != (yj > y))) {
                // 计算交点的x坐标
                double xIntersect = ( (y - yi) * (xj - xi) ) / (yj - yi) + xi;
                
                // 如果交点在点的右侧，则射线与边相交
                if (x <= xIntersect) {
                    inside = !inside;
                }
            }
        }
        
        return inside;
    }
}
